{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![alt text](https://github.com/callysto/callysto-sample-notebooks/blob/master/notebooks/images/Callysto_Notebook-Banner_Top_06.06.18.jpg?raw=true)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Creating Interactive Tables\n",
    "\n",
    "In many lab reports it may be useful if your students to have a way to record data into Jupyter. This template will help you create your own lab assignments by simplifying the creation of interactive tables and graphs. We begin my importing  our helper functions below"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "from lab_template_helpers import easy_table, graph_table"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We now have access to two functions: `easy_table` and `graph_table`. The first function allows us to create or load custom tables, and the second allows us to graph those results interactively. \n",
    "\n",
    "## Creating A Blank Table For Data Entry. \n",
    "\n",
    "We will now use the `easy_table` function with its `create_table` method. The only information you need to provide this function is the filename that you want to save your table as. In this case, we'll call it \"`demonstration.csv`. Upon executing the cell below, you will need to provide some information to create your custom table(s).  You'll be asked to provide column names and if you want custom row names (and what those names are). If you do not want custom rows names, you will need to provide the number of rows you need. Please run the cell below and follow the prompts to create your blank table. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "This will guide you through the creation of a custom empty table using your Jupyter notebook\n",
      "Please enter the names you would like to use for the columns of your table. Press enter on a blank entry when you're finished\n",
      "\n",
      "Continue to table creation (y/n)n\n",
      "Exiting...\n"
     ]
    }
   ],
   "source": [
    "easy_table.create_table(\"demonstration.csv\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Once we've created a table, we need to load it using the `load_table` method with the file we created using `create_table`. We also need to give our new table a name, in this case called `my_table`. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "13b435c90be5419080c1988a283ca26f",
       "version_major": 2,
       "version_minor": 0
      },
      "text/html": [
       "<p>Failed to display Jupyter Widget of type <code>QgridWidget</code>.</p>\n",
       "<p>\n",
       "  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\n",
       "  that the widgets JavaScript is still loading. If this message persists, it\n",
       "  likely means that the widgets JavaScript library is either not installed or\n",
       "  not enabled. See the <a href=\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\">Jupyter\n",
       "  Widgets Documentation</a> for setup instructions.\n",
       "</p>\n",
       "<p>\n",
       "  If you're reading this message in another frontend (for example, a static\n",
       "  rendering on GitHub or <a href=\"https://nbviewer.jupyter.org/\">NBViewer</a>),\n",
       "  it may mean that your frontend doesn't currently support widgets.\n",
       "</p>\n"
      ],
      "text/plain": [
       "QgridWidget(grid_options={'fullWidthRows': True, 'syncColumnCellResize': True, 'forceFitColumns': True, 'defaultColumnWidth': 150, 'rowHeight': 28, 'enableColumnReorder': False, 'enableTextSelectionOnCells': True, 'editable': True, 'autoEdit': False, 'explicitInitialization': True, 'maxVisibleRows': 15, 'minVisibleRows': 8, 'sortable': True, 'filterable': True, 'highlightSelectedCell': False, 'highlightSelectedRow': True}, precision=5, show_toolbar=True)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "my_table = easy_table.load_table('demonstration.csv')\n",
    "my_table"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Where this created table will only accept numerical entries. To modify the table, click on a cell and enter a new number. We do however note that using custom tables like this, it is not possible to type in your own \"text based\" results. These custom tables are for numbers only. \n",
    "\n",
    "Note you can sort and filter values in the table by clicking either the column name or the icon beside the column name respectively. \n",
    "\n",
    "\n",
    "## Loading A Preexisting File (Online or Local)\n",
    "\n",
    "If you don't want to create a blank table, you can load your own csv files, either from the internet or from your own Callysto directory. This is done using the `load_table` function. However, now we specify either a pre-filled csv file or one online. The example below shows how to load an online table. Note how we've also specified \"`external = True`\" to ensure that our loaded table will be properly indexed. \n",
    "\n",
    "### Note\n",
    "If this was a local file saved to your personal Callysto hub, we would type the file's path instead of a URL here. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "6fa9f5cb827c494ab0584257afc40983",
       "version_major": 2,
       "version_minor": 0
      },
      "text/html": [
       "<p>Failed to display Jupyter Widget of type <code>QgridWidget</code>.</p>\n",
       "<p>\n",
       "  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\n",
       "  that the widgets JavaScript is still loading. If this message persists, it\n",
       "  likely means that the widgets JavaScript library is either not installed or\n",
       "  not enabled. See the <a href=\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\">Jupyter\n",
       "  Widgets Documentation</a> for setup instructions.\n",
       "</p>\n",
       "<p>\n",
       "  If you're reading this message in another frontend (for example, a static\n",
       "  rendering on GitHub or <a href=\"https://nbviewer.jupyter.org/\">NBViewer</a>),\n",
       "  it may mean that your frontend doesn't currently support widgets.\n",
       "</p>\n"
      ],
      "text/plain": [
       "QgridWidget(grid_options={'fullWidthRows': True, 'syncColumnCellResize': True, 'forceFitColumns': True, 'defaultColumnWidth': 150, 'rowHeight': 28, 'enableColumnReorder': False, 'enableTextSelectionOnCells': True, 'editable': True, 'autoEdit': False, 'explicitInitialization': True, 'maxVisibleRows': 15, 'minVisibleRows': 8, 'sortable': True, 'filterable': True, 'highlightSelectedCell': False, 'highlightSelectedRow': True}, precision=5, show_toolbar=True)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "online_table = easy_table.load_table(\"https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv\", \n",
    "                                        external=True)\n",
    "online_table"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Where conversely to the blank table, in the 'species' column, you are free to enter your own text. \n",
    "## Non-Comma Separated CSV files.\n",
    "\n",
    "In the event that you want to use a CSV with an alternative delimiter, we must specify the optional `sep` (for separator) argument. This allows us to properly read CSV files with delimiters such as\n",
    "\n",
    "1. tabs $\\rightarrow$ \"`\\t`\"\n",
    "2. Semicolons $\\rightarrow$ \"`;`\"\n",
    "3. Pipes $\\rightarrow$ \"`|`\"\n",
    "\n",
    "We demonstrate this below, first an example of if you do not specify your alternative delimiter"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "2a58a9f0032d46beb87bb758501254cf",
       "version_major": 2,
       "version_minor": 0
      },
      "text/html": [
       "<p>Failed to display Jupyter Widget of type <code>QgridWidget</code>.</p>\n",
       "<p>\n",
       "  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\n",
       "  that the widgets JavaScript is still loading. If this message persists, it\n",
       "  likely means that the widgets JavaScript library is either not installed or\n",
       "  not enabled. See the <a href=\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\">Jupyter\n",
       "  Widgets Documentation</a> for setup instructions.\n",
       "</p>\n",
       "<p>\n",
       "  If you're reading this message in another frontend (for example, a static\n",
       "  rendering on GitHub or <a href=\"https://nbviewer.jupyter.org/\">NBViewer</a>),\n",
       "  it may mean that your frontend doesn't currently support widgets.\n",
       "</p>\n"
      ],
      "text/plain": [
       "QgridWidget(grid_options={'fullWidthRows': True, 'syncColumnCellResize': True, 'forceFitColumns': True, 'defaultColumnWidth': 150, 'rowHeight': 28, 'enableColumnReorder': False, 'enableTextSelectionOnCells': True, 'editable': True, 'autoEdit': False, 'explicitInitialization': True, 'maxVisibleRows': 15, 'minVisibleRows': 8, 'sortable': True, 'filterable': True, 'highlightSelectedCell': False, 'highlightSelectedRow': True}, precision=5, show_toolbar=True)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "tab_separated = easy_table.load_table(\"https://raw.githubusercontent.com/goodby/csv/master/src/Goodby/CSV/Import/Tests/Standard/Join/csv_files/tab-separated.csv\",\n",
    "                                        external = True)\n",
    "tab_separated"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note how all our values get parsed line-by-line, rather than into individual cells. If we specify the delimiter we get the following"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "bc385497cb394a3ba87d3d52c629281c",
       "version_major": 2,
       "version_minor": 0
      },
      "text/html": [
       "<p>Failed to display Jupyter Widget of type <code>QgridWidget</code>.</p>\n",
       "<p>\n",
       "  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\n",
       "  that the widgets JavaScript is still loading. If this message persists, it\n",
       "  likely means that the widgets JavaScript library is either not installed or\n",
       "  not enabled. See the <a href=\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\">Jupyter\n",
       "  Widgets Documentation</a> for setup instructions.\n",
       "</p>\n",
       "<p>\n",
       "  If you're reading this message in another frontend (for example, a static\n",
       "  rendering on GitHub or <a href=\"https://nbviewer.jupyter.org/\">NBViewer</a>),\n",
       "  it may mean that your frontend doesn't currently support widgets.\n",
       "</p>\n"
      ],
      "text/plain": [
       "QgridWidget(grid_options={'fullWidthRows': True, 'syncColumnCellResize': True, 'forceFitColumns': True, 'defaultColumnWidth': 150, 'rowHeight': 28, 'enableColumnReorder': False, 'enableTextSelectionOnCells': True, 'editable': True, 'autoEdit': False, 'explicitInitialization': True, 'maxVisibleRows': 15, 'minVisibleRows': 8, 'sortable': True, 'filterable': True, 'highlightSelectedCell': False, 'highlightSelectedRow': True}, precision=5, show_toolbar=True)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "tab_separated = easy_table.load_table(\"https://raw.githubusercontent.com/goodby/csv/master/src/Goodby/CSV/Import/Tests/Standard/Join/csv_files/tab-separated.csv\",\n",
    "                                        external = True,\n",
    "                                        sep = '\\t')\n",
    "tab_separated"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Which is the desired result. \n",
    "\n",
    "## Saving an Updated Table\n",
    "\n",
    "If your students have created their own data table/modified an existing one, it is possible to save their changes for later. To do this, use the `save_table` method of our `easy_table` function. In this case, feel free to change the entries of `my_table` to save your modifications. \n",
    "\n",
    "To use `save_table` we need to tell it which table we'd like to save, as well as provide a filename to save it as. We demonstrate this below."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saved file updated_demonstration.csv successfully\n"
     ]
    }
   ],
   "source": [
    "easy_table.save_table(my_table, \"updated_demonstration.csv\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can now load our updated table and see the changes that we've made to our table. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "e5eb04c6f348446489b9da3f08ce5068",
       "version_major": 2,
       "version_minor": 0
      },
      "text/html": [
       "<p>Failed to display Jupyter Widget of type <code>QgridWidget</code>.</p>\n",
       "<p>\n",
       "  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\n",
       "  that the widgets JavaScript is still loading. If this message persists, it\n",
       "  likely means that the widgets JavaScript library is either not installed or\n",
       "  not enabled. See the <a href=\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\">Jupyter\n",
       "  Widgets Documentation</a> for setup instructions.\n",
       "</p>\n",
       "<p>\n",
       "  If you're reading this message in another frontend (for example, a static\n",
       "  rendering on GitHub or <a href=\"https://nbviewer.jupyter.org/\">NBViewer</a>),\n",
       "  it may mean that your frontend doesn't currently support widgets.\n",
       "</p>\n"
      ],
      "text/plain": [
       "QgridWidget(grid_options={'fullWidthRows': True, 'syncColumnCellResize': True, 'forceFitColumns': True, 'defaultColumnWidth': 150, 'rowHeight': 28, 'enableColumnReorder': False, 'enableTextSelectionOnCells': True, 'editable': True, 'autoEdit': False, 'explicitInitialization': True, 'maxVisibleRows': 15, 'minVisibleRows': 8, 'sortable': True, 'filterable': True, 'highlightSelectedCell': False, 'highlightSelectedRow': True}, precision=5, show_toolbar=True)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "easy_table.load_table(\"updated_demonstration.csv\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Special Note\n",
    "If you're creating a lab report for your students to use, they may never need to see the `create_table` function (unless of course you want them to). If you create the table yourself, you can distribute the created `CSV` file with the lab report and have your students load the file. Certainly, it may be easier to get students to create their own tables individually. \n",
    "\n",
    "\n",
    "\n",
    "\n",
    "# Interactive Graph Using Created/Loaded Tables\n",
    "\n",
    "To graph the data in a modified or downloaded table, we can use the `graph_from_table` method from the `graph_table` function. The `graph_from_table` method takes one argument which is the name of the table you created. For demonstration purposes, we will be using the `online_table` with `graph_from_table`. \n",
    "\n",
    "In the cell below we've provided some more examples of open data sets. In this case we've re-hosted all of these data sets on the Cybera cloud only to make downloading within Alberta slightly faster. All of these data sets are available freely online. Feel free to uncomment any table of interest in order to test out the functionality of both the table and the graph. We do note however that for larger files, it may take a few moments to download and plot. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "81e4fb6aa8b342d9afebb998fb711d6a",
       "version_major": 2,
       "version_minor": 0
      },
      "text/html": [
       "<p>Failed to display Jupyter Widget of type <code>QgridWidget</code>.</p>\n",
       "<p>\n",
       "  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\n",
       "  that the widgets JavaScript is still loading. If this message persists, it\n",
       "  likely means that the widgets JavaScript library is either not installed or\n",
       "  not enabled. See the <a href=\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\">Jupyter\n",
       "  Widgets Documentation</a> for setup instructions.\n",
       "</p>\n",
       "<p>\n",
       "  If you're reading this message in another frontend (for example, a static\n",
       "  rendering on GitHub or <a href=\"https://nbviewer.jupyter.org/\">NBViewer</a>),\n",
       "  it may mean that your frontend doesn't currently support widgets.\n",
       "</p>\n"
      ],
      "text/plain": [
       "QgridWidget(grid_options={'fullWidthRows': True, 'syncColumnCellResize': True, 'forceFitColumns': True, 'defaultColumnWidth': 150, 'rowHeight': 28, 'enableColumnReorder': False, 'enableTextSelectionOnCells': True, 'editable': True, 'autoEdit': False, 'explicitInitialization': True, 'maxVisibleRows': 15, 'minVisibleRows': 8, 'sortable': True, 'filterable': True, 'highlightSelectedCell': False, 'highlightSelectedRow': True}, precision=5, show_toolbar=True)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "## Data set of nutritional information of 80 cereal brands\n",
    "\n",
    "# online_table = easy_table.load_table(\"https://swift-yeg.cloud.cybera.ca:8080/v1/AUTH_233e84cd313945c992b4b585f7b9125d/callysto-open-data/cereal.csv\",\n",
    "#                                     external=True)\n",
    "\n",
    "## Data set of ground hog day shadow observations and temperatures\n",
    "\n",
    "# online_table = easy_table.load_table(\"https://swift-yeg.cloud.cybera.ca:8080/v1/AUTH_233e84cd313945c992b4b585f7b9125d/callysto-open-data/archive.csv\",\n",
    "#                                    external = True)\n",
    "\n",
    "## Women's shoe data set, NOTE: This is a large data set (>100 mb) and will be a little slow. However, it is \n",
    "## an excellent data set to play with the filter capabilities of the table in order to make plotting a little \n",
    "## faster. \n",
    "\n",
    "# online_table = easy_table.load_table(\"https://swift-yeg.cloud.cybera.ca:8080/v1/AUTH_233e84cd313945c992b4b585f7b9125d/callysto-open-data/7210_1.csv\",\n",
    "#                                     external = True)\n",
    "\n",
    "## Data set of world comodity prices. NOTE: This is another large file (~90 mb) and plotting may be slow if\n",
    "## you don't filter the table first.\n",
    "\n",
    "# online_table = easy_table.load_table(\"https://swift-yeg.cloud.cybera.ca:8080/v1/AUTH_233e84cd313945c992b4b585f7b9125d/callysto-open-data/WFPVAM_FoodPrices_05-12-2017.csv\", \n",
    "#                                     external = True)\n",
    "online_table\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<script>requirejs.config({paths: { 'plotly': ['https://cdn.plot.ly/plotly-latest.min']},});if(!window.Plotly) {{require(['plotly'],function(plotly) {window.Plotly=plotly;});}}</script>"
      ],
      "text/vnd.plotly.v1+html": [
       "<script>requirejs.config({paths: { 'plotly': ['https://cdn.plot.ly/plotly-latest.min']},});if(!window.Plotly) {{require(['plotly'],function(plotly) {window.Plotly=plotly;});}}</script>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "5078ca7ae7904d1bb33a48d313b02baf",
       "version_major": 2,
       "version_minor": 0
      },
      "text/html": [
       "<p>Failed to display Jupyter Widget of type <code>interactive</code>.</p>\n",
       "<p>\n",
       "  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\n",
       "  that the widgets JavaScript is still loading. If this message persists, it\n",
       "  likely means that the widgets JavaScript library is either not installed or\n",
       "  not enabled. See the <a href=\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\">Jupyter\n",
       "  Widgets Documentation</a> for setup instructions.\n",
       "</p>\n",
       "<p>\n",
       "  If you're reading this message in another frontend (for example, a static\n",
       "  rendering on GitHub or <a href=\"https://nbviewer.jupyter.org/\">NBViewer</a>),\n",
       "  it may mean that your frontend doesn't currently support widgets.\n",
       "</p>\n"
      ],
      "text/plain": [
       "interactive(children=(VBox(children=(Output(), HBox(children=(VBox(children=(Dropdown(description='X axis data', options=('name', 'mfr', 'type', 'calories', 'protein', 'fat', 'sodium', 'fiber', 'carbo', 'sugars', 'potass', 'vitamins', 'shelf', 'weight', 'cups', 'rating'), value='name'), Dropdown(description='Y axis data', index=1, options=('name', 'mfr', 'type', 'calories', 'protein', 'fat', 'sodium', 'fiber', 'carbo', 'sugars', 'potass', 'vitamins', 'shelf', 'weight', 'cups', 'rating'), value='mfr'), Dropdown(description='Plot Type', options=('scatter', 'line', 'bar'), value='scatter'))), VBox(children=(Text(value='', continuous_update=False, description='Plot title:', placeholder='Enter plot title'), Text(value='', continuous_update=False, description='Y axis label:', placeholder='Y axis title'), Text(value='', continuous_update=False, description='X axis label:', placeholder='X axis title')))))), layout=Layout(align_items='center', border='solid', display='flex', flex_flow='column', width='100%')),), _dom_classes=('widget-interact',))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "graph_table.graph_from_table(online_table)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In the widget above, you have three drop down menus with the following functions\n",
    "\n",
    "1. X axis data: This drop down selects which column of your data table to use as your $x$ points on the graph.\n",
    "2. Y axis data: This drop down selects which column of your data table to use as your $y$ points on the graph.\n",
    "3. Plot Type: This drop down allows to you to choose from a scatter plot, a line plot, or a bar graph to plot your data\n",
    "\n",
    "There are also three text entry boxes with the following function\n",
    "\n",
    "1. Plot title: Enter the title of your plot here\n",
    "2. Y axis label: Enter the title of the $y$ axis here\n",
    "3. X axis label: Enter the title of the $x$ axis here.\n",
    "\n",
    "### Note\n",
    "If you filter or sort your interactive table then re-run the plot cell, any sortation and filters will present in the data in the graph. \n",
    "\n",
    "### Other Plot Functionality\n",
    "\n",
    "If you hover your mouse of the plot you will be able to zoom on a highlighted area. There are several other functions along the top menu of the plot such as saving the image."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![alt text](https://github.com/callysto/callysto-sample-notebooks/blob/master/notebooks/images/Callysto_Notebook-Banners_Bottom_06.06.18.jpg?raw=true)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
